package project

import (
	"log"
	"net"
	"sync"
	"time"
)

const tcp = "tcp"

// 服务端
func TcpServer() {

	// 服务端地址
	// adress := "127.0.0.1:" //省略端口
	// adress := "127.0.0.1:8080" //IPv4
	// adress := "[::1]:8080" //IPv6
	adress := ":8080" //Any IP version

	listener, err := net.Listen(tcp, adress) //Listen监听
	if err != nil {
		log.Fatalln(err)
	}
	// 关闭监听
	defer listener.Close()
	log.Println("Server is listening on ", tcp, listener.Addr())

	// 接收请求
	for {
		// 阻塞接受
		conn, err := listener.Accept() //Accept接收
		if err != nil {
			log.Println(err)
		}

		// 处理请求,读写
		// 日志链接远程地址(client addr)
		log.Println("accept a new link", conn.RemoteAddr())
		// go handleConn(conn)
	}

}

// 客户端
func TcpClient() {
	// 客户端地址
	// ServerAddress := "127.0.0.1:8080" //IPv4

	// TCP协议类型
	ServerAddress := "[::1]:8080" //IPv6
	// 建立链接
	// 模拟多客服端
	// 并发客户端请求
	num := 10
	wg := sync.WaitGroup{} //等待组
	wg.Add(num)

	for i := 0; i < num; i++ {
		// 并发请求
		go func(wg *sync.WaitGroup) {
			defer wg.Done()
			conn, err := net.Dial(tcp, ServerAddress) //Dial发起
			if err != nil {
				log.Println(err)
				return
			}
			// 保证关闭
			defer conn.Close()
			log.Println("connect to establish client addr is", conn.LocalAddr()) //LocalAddr当前地址
		}(&wg)
	}
	wg.Wait()
}

// 客户端超时
func TcpTimeoutClient() {
	// 客户端地址
	adress := "172.28.96.111:8080" //IPv4

	// TCP协议类型
	// adress := "[::1]:8080" //IPv6
	// 建立链接
	// 模拟多客服端
	// 并发客户端请求
	num := 10
	wg := sync.WaitGroup{} //等待组
	wg.Add(num)

	for i := 0; i < num; i++ {
		// 并发请求
		go func(wg *sync.WaitGroup) {
			defer wg.Done()
			conn, err := net.DialTimeout(tcp, adress, time.Second)
			if err != nil {
				log.Println(err)
				return
			}
			// 保证关闭
			defer conn.Close()
			log.Println("connect to DialTimeout client addr is", conn.LocalAddr())
		}(&wg)
	}
	wg.Wait()
}
